"""
4. 切片的使用

题目：编写一个Python程序，随机生成20个由大小写字母、数字和下划线组成的字符组，并使用字符串、列表、集合和元组的方法打印出来。
对字符串和列表切片，用两种方式取出4-14位的字符。
提示：
    1. 使用random.randint()函数生成随机整数。
    2. 使用random.choice()函数从字符组中随机选择一个字符。
    3. 字符串切片：str[start:end]，列表切片：list[start:end]。
"""

# import random

# 随机生成20个字符（请补充完整代码）
import random
import string


def generate_and_slice():
    # 定义可用字符集
    available_chars = string.ascii_letters + string.digits + '_'

    try:
        # 生成20个随机字符
        random_chars = [random.choice(available_chars) for _ in range(20)]

        # 转换为不同数据类型
        char_string = ''.join(random_chars)
        char_list = list(random_chars)
        char_tuple = tuple(random_chars)
        char_set = set(random_chars)

        # 打印原始数据
        print("生成的20个随机字符：")
        print(f"字符串形式: {char_string}")
        print(f"列表形式: {char_list}")
        print(f"元组形式: {char_tuple}")
        print(f"集合形式: {char_set}")

        # 使用切片获取4-14位字符
        print("\n切片操作（获取4-14位字符）：")

        # 方法1：使用普通切片
        print("\n方法1 - 使用基本切片 [4:15]：")
        print(f"字符串切片: {char_string[4:15]}")
        print(f"列表切片: {char_list[4:15]}")

        # 方法2：使用步长为1的切片
        print("\n方法2 - 使用带步长的切片 [4:15:1]：")
        print(f"字符串切片: {char_string[4:15:1]}")
        print(f"列表切片: {char_list[4:15:1]}")

        # 额外展示：其他切片操作
        print("\n额外展示 - 其他切片操作：")
        print(f"反向切片 [-15:-4]: {char_string[-15:-4]}")
        print(f"步长为2的切片 [4:15:2]: {char_string[4:15:2]}")
        print(f"反向输出 [::-1]: {char_string[::-1]}")

    except Exception as e:
        print(f"发生错误: {str(e)}")


def print_slice_info(sequence, start, end, step=None):
    """打印切片的详细信息"""
    slice_result = sequence[start:end] if step is None else sequence[start:end:step]
    print(f"切片 [{start}:{end}{':%d' % step if step else ''}] 结果: {slice_result}")
    print(f"切片长度: {len(slice_result)}")


if __name__ == "__main__":
    generate_and_slice()

